home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byte0787.arc / BENCH.ADA next >
Encoding:
Text File  |  1980-01-13  |  12.5 KB  |  608 lines

  1. The following benchmark listings accompany Namir Clement Shammas's review of four Ada compilers: Alsys/Ada, Artek Ada, Meridian Ada, and Janus Ada.
  2.  
  3. Listing 1.  Source code for Ada sieve benchmark program.
  4.  
  5. with TEXT_IO;
  6. use TEXT_IO;
  7.  
  8. -- package INTIO is new INTEGER_IO(INTEGER);
  9.  
  10. PROCEDURE  MTSIE10 is
  11.  
  12. SIZE : constant INTEGER := 7000;
  13.  
  14. TYPE Flag_Array is array(0..SIZE) of BOOLEAN;
  15.  
  16. PRIME, K, COUNT : INTEGER;
  17. FLAGS : Flag_Array;
  18.  
  19. BEGIN
  20.  
  21.     PUT_LINE("START TEN ITERATIONS");
  22.     FOR ITER IN 1..10 LOOP
  23.         COUNT := 0;
  24.  
  25.         FOR I IN 0..SIZE LOOP
  26.             FLAGS(I) := TRUE;
  27.         END LOOP;
  28.  
  29.         FOR I IN 0..SIZE LOOP
  30.  
  31.             IF FLAGS(I) THEN
  32.                 PRIME := I + I + 3;
  33.                 K := I + PRIME;
  34.  
  35.                 WHILE K <= SIZE LOOP
  36.                     FLAGS(K) := FALSE;
  37.                     K := K + PRIME;
  38.                 END LOOP;
  39.  
  40.                 COUNT := COUNT + 1;
  41.  
  42.             END IF;
  43.  
  44.         END LOOP;
  45.  
  46.     END LOOP;
  47.  
  48.     PUT(INTEGER'IMAGE(COUNT));
  49.     PUT_LINE(" PRIMES");
  50.  
  51. END MTSIE10;
  52.  
  53.  
  54. Listing 2.  Source code for Ada integer sort benchmark program.
  55.  
  56. with TEXT_IO;
  57. use TEXT_IO;
  58.  
  59. Procedure MTSort2 is
  60. -- Program will test the speed of sorting an integer array.
  61. -- The program will create an array sorted from smaller to larger
  62. -- integers, then sort them in the reverse order.
  63. -- The array is reverse sorted ten times.
  64.  
  65.    package INTIO is new INTEGER_IO(INTEGER);
  66.  
  67. SIZE : constant := 1000;
  68.  
  69. TYPE NUMBERS is ARRAY(1..SIZE) OF INTEGER;
  70.  
  71. InOrder, AscendingOrder : BOOLEAN;
  72. Offset, Temporary : INTEGER;
  73. Ch : CHARACTER;
  74. A : NUMBERS;
  75.  
  76. PROCEDURE InitializeArray is
  77. -- Procedure to initialize array
  78. BEGIN
  79.     PUT_LINE("Initializing integer array");
  80.     FOR I IN 1..SIZE LOOP
  81.         A(I) := I;
  82.     END LOOP;
  83. END InitializeArray;
  84.  
  85. PROCEDURE ShellSort is
  86. -- Procedure to perform a Shell-Meztner sorting
  87.  
  88. I : INTEGER;
  89.  
  90.     PROCEDURE SwapThem(I, J : in INTEGER) is
  91.     -- Local procedure to swap elements A(I) and A(J)
  92.     BEGIN
  93.        InOrder := FALSE;
  94.        Temporary := A(I);
  95.        A(I) := A(J);
  96.        A(J) := Temporary;
  97.     END SwapThem;
  98.  
  99. BEGIN
  100.    -- Toggle "AscendingOrder" flag status
  101.        AscendingOrder := NOT AscendingOrder;
  102.        Offset := SIZE;
  103.        WHILE Offset > 1 LOOP
  104.            Offset := Offset / 2;
  105.            LOOP
  106.                InOrder := TRUE;
  107.                FOR J IN 1..(SIZE - Offset) LOOP
  108.                    I := J + Offset;
  109.                    IF AscendingOrder
  110.                        THEN IF A(I) < A(J) THEN SwapThem(I,J); END IF;
  111.                        ELSE IF A(I) > A(J) THEN SwapThem(I,J); END IF;
  112.                    END IF; -- AscendingOrder
  113.                END LOOP;
  114.                IF InOrder THEN EXIT; END IF;
  115.            END LOOP;
  116.        END LOOP;
  117. END ShellSort;
  118.  
  119. PROCEDURE DisplayArray is
  120. -- Display array members
  121. BEGIN
  122.     FOR I IN 1..SIZE LOOP
  123.         INTIO.PUT(A(I),3);
  124.         PUT("  ");
  125.     END LOOP;
  126.     NEW_LINE;
  127. END DisplayArray;
  128.  
  129. BEGIN -- Main
  130.     InitializeArray;
  131.     AscendingOrder := TRUE;
  132.     PUT("Beginning to sort press <cr> "); GET(Ch); NEW_LINE;
  133.     FOR Iter IN 1..10  LOOP
  134.        PUT(".");
  135.        ShellSort;
  136.     END LOOP;
  137.     PUT_LINE("Finished sorting!");
  138.     DisplayArray;
  139. END MTSort2;
  140.  
  141. Listing 3.  Source code for Ada basic floating benchmark program.
  142.  
  143. WITH TEXT_IO; USE TEXT_IO;
  144. PROCEDURE MTFLOAT is
  145.  
  146. PACKAGE RealInOut is new FLOAT_IO(FLOAT);
  147. USE RealInOut;
  148.  
  149. NR : CONSTANT INTEGER := 5000;
  150.  
  151. A, B, C : FLOAT;
  152.  
  153. BEGIN
  154.     A := 2.71828;
  155.     B := 3.1459;
  156.     C := 1.0;
  157.  
  158.     FOR I IN 1..NR LOOP
  159.         C := C * A;
  160.         C := C * B;
  161.         C := C / A;
  162.         C := C / B;
  163.     END LOOP;
  164.  
  165.     PUT("DONE");
  166.     NEW_LINE;
  167.     PUT("ERROR = ");
  168.     PUT((C-1.0));
  169.     NEW_LINE;
  170. END MTFLOAT;
  171.  
  172. Listing 4.  Source code for Ada matrix inversion floating benchmark program.
  173.  
  174. with TEXT_IO;
  175. use TEXT_IO;
  176.  
  177. Procedure MTINVERT is
  178.  
  179. -- Program to test speed of floating point matrix inversion.
  180. -- The program will form a matrix with ones' in every member,
  181. -- except the diagonals which will have values of 2.
  182.  
  183.   package RealInOut is new FLOAT_IO(FLOAT);
  184.  
  185.   MAX : constant := 20;
  186.  
  187.   TYPE MATRIX is ARRAY (1..MAX,1..MAX) OF FLOAT;
  188.  
  189.   J, K, L: INTEGER;
  190.   DET, PIVOT, TEMPO: FLOAT;
  191.   A: MATRIX;
  192.  
  193. Procedure Invert is
  194.  
  195.  BEGIN
  196.  
  197.  -- Creating test matrix
  198.  
  199.   FOR J IN 1..MAX LOOP
  200.  
  201.     FOR K IN 1..MAX LOOP
  202.  
  203.       A(J, K) := 1.0;
  204.  
  205.     END LOOP;
  206.  
  207.     A(J, J) := 2.0;
  208.  
  209.   END LOOP;
  210.  
  211.  
  212.   PUT_LINE("Starting matrix invertion");
  213.  
  214.  
  215.   DET := 1.0;
  216.  
  217.   FOR J IN 1..MAX LOOP
  218.  
  219.     PIVOT := A(J, J);
  220.     DET := DET*PIVOT;
  221.     A(J, J) := 1.0;
  222.  
  223.     FOR K IN 1..MAX LOOP
  224.  
  225.       A(J, K) := A(J, K) / PIVOT;
  226.  
  227.     END LOOP;
  228.  
  229.     FOR K IN 1..MAX LOOP
  230.  
  231.       IF K /= J THEN
  232.  
  233.         TEMPO := A(K, J);
  234.         A(K, J) := 0.0;
  235.  
  236.         FOR L IN 1..MAX LOOP
  237.  
  238.           A(K, L) := A(K, L) - A(J, L) * TEMPO;
  239.  
  240.         END LOOP;
  241.  
  242.       END IF;
  243.  
  244.     END LOOP;
  245.  
  246.   END LOOP;
  247.  
  248.  END Invert;
  249.  
  250. BEGIN
  251.  
  252.   NEW_LINE(2);
  253.   Invert;
  254.   PUT("Determinant = ");
  255.   RealInOut.PUT(DET,14,10);
  256.   NEW_LINE(2);
  257.  
  258. END MTINVERT;
  259.  
  260. Listing 5.  Source code for Ada math functions benchmark program.
  261.  
  262. -- use Janus/Ada libraries
  263. WITH TEXT_IO; WITH SMATHLIB;
  264. USE TEXT_IO; USE SMATHLIB;
  265.  
  266. PROCEDURE MTMath is  
  267.  
  268. -- Program tests the speed of math function.  
  269. -- Each function is timed separately.         
  270. -- Functions are shown in the import list     
  271.  
  272.  
  273. pi, angle, result, argument: FLOAT;
  274. dummy: CHARACTER; 
  275.  
  276. BEGIN 
  277.   PUT_LINE("START SQUARE ROOT TEST"); 
  278.   PUT("PRESS <CR> TO START"); 
  279.   GET(dummy); New_Line; 
  280.  
  281.   FOR i in 1..10 LOOP 
  282.     PUT("."); 
  283.     argument := 0.0; 
  284.     WHILE argument <= 1000.0 LOOP 
  285.       result := Sqrt(argument); 
  286.       argument := argument + 1.0;
  287.     END LOOP;
  288.   END LOOP;
  289.  
  290.   New_Line; PUT("END OF SQUARE ROOT TEST"); New_Line; 
  291.         
  292.   PUT("START LOG TEST"); 
  293.   New_Line; 
  294.   PUT("PRESS <CR> TO START"); 
  295.   GET(dummy); New_Line; 
  296.  
  297.   FOR i in 1..10 LOOP 
  298.     PUT("."); 
  299.     argument := 0.1; 
  300.     WHILE argument <= 1000.1 LOOP 
  301.       result := Log(argument); 
  302.       argument := argument + 1.0;
  303.     END LOOP; 
  304.   END LOOP;  
  305.  
  306.   New_Line; PUT("END OF LOG TEST"); New_Line; 
  307.  
  308.   PUT("START EXPONENTIAL TEST"); 
  309.   New_Line; 
  310.   PUT("PRESS <CR> TO START"); 
  311.   GET(dummy); New_Line; 
  312.  
  313.   FOR i in 1..10 LOOP 
  314.     PUT("."); 
  315.     argument := 0.1; 
  316.     WHILE argument <= 10.0 LOOP 
  317.       result := exp(argument); 
  318.       argument := argument + 0.01;
  319.     END LOOP; 
  320.   END LOOP;  
  321.  
  322.   New_Line; PUT("END OF EXPONENTIAL TEST"); New_Line; 
  323.  
  324.   PUT("START ARCTANGENT TEST"); 
  325.   New_Line; 
  326.   PUT("PRESS <CR> TO START"); 
  327.   GET(dummy); New_Line; 
  328.  
  329.   FOR i in 1..10 LOOP 
  330.     PUT("."); 
  331.     argument := 0.1; 
  332.     WHILE argument <= 10.0 LOOP 
  333.       angle := arctan(argument); 
  334.       argument := argument + 0.01;
  335.     END LOOP; 
  336.   END LOOP;  
  337.  
  338.   New_Line; PUT("END OF ARCTANGENT TEST"); New_Line; 
  339.  
  340.  
  341.   pi := 355.0 / 113.0; 
  342.   PUT("START SINE TEST"); 
  343.   New_Line; 
  344.   PUT("PRESS <CR> TO START"); 
  345.   GET(dummy); New_Line; 
  346.  
  347.   FOR i in 1..10 LOOP 
  348.     PUT("."); 
  349.     angle := 0.0; 
  350.     WHILE angle <= 2.0 * pi LOOP 
  351.       result := sin(angle); 
  352.       angle := angle + pi / 360.0;
  353.     END LOOP; 
  354.   END LOOP;  
  355.  
  356.   New_Line; PUT("END OF SINE TEST"); New_Line; 
  357.   New_Line;
  358.   PUT("DONE"); New_Line; New_Line;
  359.  
  360. END MTMath;
  361.  
  362. Listing 6.  Source code for Ada recursion benchmark program.
  363.  
  364. with TEXT_IO;
  365. use TEXT_IO;
  366.  
  367. Procedure MTQSort is
  368.  
  369. -- The test uses QuickSort to measure recursion speed
  370. -- An ordered array is created by the program and is
  371. -- reverse sorted.  The process is performed "MAXITER"
  372. -- number of times.
  373.  
  374. package Int_IO is new INTEGER_IO(INTEGER);
  375.  
  376. SIZE : constant := 1000;
  377. MAXITER : constant := 10;
  378. WantToListArray : constant BOOLEAN := FALSE; -- Flag used for debugging
  379.  
  380. TYPE Numbers is ARRAY(1..SIZE) OF INTEGER;
  381.  
  382. A : Numbers;
  383.  
  384. PROCEDURE InitializeArray is
  385. -- Procedure to initialize array
  386.  
  387. BEGIN
  388.     FOR I in 1..SIZE LOOP
  389.         A(I) := SIZE - I + 1;
  390.     END LOOP;
  391.     NEW_LINE(3);
  392. END InitializeArray;
  393.  
  394. PROCEDURE QuickSort is
  395. -- Procedure to perform a QuickSort
  396.  
  397. PROCEDURE Sort(Left, Right : INTEGER) is
  398.  
  399. i, j : INTEGER;
  400. Data1, Data2 : INTEGER;
  401.  
  402. BEGIN
  403.     i := Left; j := Right;
  404.     Data1 := A((Left + Right) / 2);
  405.     LOOP
  406.         WHILE A(i) < Data1 LOOP i := i + 1; END LOOP;
  407.         WHILE Data1 < A(j) LOOP j := j - 1; END LOOP;
  408.         IF i <= j THEN
  409.             Data2 := A(i); A(i) := A(j); A(j) := Data2;
  410.             i := i + 1;
  411.             j := j - 1;
  412.         END IF;
  413.         IF i > j THEN EXIT; END IF;
  414.     END LOOP;
  415.     IF Left < j  THEN Sort(Left,j);  END IF;
  416.     IF i < Right THEN Sort(i,Right); END IF;
  417. END Sort;
  418.  
  419. BEGIN
  420.     Sort(1,SIZE);
  421. END QuickSort;
  422.  
  423. PROCEDURE DisplayArray is
  424. -- Display array members
  425. BEGIN
  426.     FOR I in 1..SIZE LOOP
  427.         Int_IO.PUT(A(I),4);
  428.         PUT("  ");
  429.     END LOOP;
  430.     NEW_LINE;
  431. END DisplayArray;
  432.  
  433. BEGIN -- Main
  434.     FOR Iter in 1..MAXITER  LOOP
  435.        InitializeArray;
  436.        PUT(".");
  437.        QuickSort;
  438.     END LOOP;
  439.     NEW_LINE;
  440.     PUT_LINE("Finished sorting!");
  441.     IF WantToListArray THEN DisplayArray; END IF;
  442. END MTQSort;
  443.  
  444. Listing 7.  Source code for Ada dynamic allocation benchmark program.
  445.  
  446.  
  447. with TEXT_IO;
  448. use TEXT_IO;
  449.  
  450. PROCEDURE MTPtr is
  451.  
  452. -----------------------------------------------
  453. -- Program to measure the speed of:
  454. --
  455. -- 1) Allocating dynamic binary-tree structure
  456. --
  457. -- 2) Searching through the binary-tree
  458. -----------------------------------------------
  459.  
  460.  
  461. SIZE : constant INTEGER := 1000;
  462. MainLoopCount : constant INTEGER := 200;
  463.  
  464. TYPE Node;
  465.  
  466. TYPE Ptr is access Node;
  467.  
  468. TYPE Node is record
  469.               Value : INTEGER;
  470.               Left, Right : Ptr;
  471.             end record;
  472.  
  473. TYPE NumbersArray is ARRAY (1..SIZE) OF INTEGER;
  474.  
  475. Numbers : NumbersArray;
  476. TreeRoot : Ptr;
  477. dummy : CHARACTER;
  478.  
  479.  
  480. PROCEDURE Create is
  481.  
  482. J : INTEGER := 1;
  483.  
  484. BEGIN
  485.  
  486.     WHILE J <= SIZE LOOP
  487.         IF (J >= 1) AND (J < 251) THEN
  488.            Numbers(J) := J;
  489.         ELSIF (J > 250) AND (J < 501) THEN
  490.            Numbers(J) := SIZE - J;
  491.         ELSIF (J > 500) AND (J < 750) THEN
  492.            Numbers(J) := J;
  493.         ELSE
  494.            Numbers(J) := SIZE - J;
  495.         END IF;
  496.         J := J + 1;
  497.         PUT(INTEGER'IMAGE(J) & "  ");
  498.     END LOOP;
  499.     new_line;
  500. END Create;
  501.  
  502. PROCEDURE Insert(Root : in out Ptr; Item : INTEGER) is
  503. -- Insert element in binary-tree
  504. BEGIN
  505.     IF Root = null THEN
  506.         Root := new Node;
  507.         Root.Value := Item;
  508.         Root.Left := null;
  509.         Root.Right := null;
  510.     ELSE
  511.         IF Item < Root.Value THEN Insert(Root.Left,Item);
  512.                              ELSE Insert(Root.Right,Item);
  513.         END IF;
  514.     END IF;
  515. END Insert;
  516.  
  517.  
  518. PROCEDURE Search(Root : in out Ptr; Target : INTEGER) is
  519. -- Recursive procedure to search for Target value
  520. BEGIN
  521.     IF not (Root = null) THEN
  522.         IF not (Target = Root.Value) THEN
  523.             IF Target < Root.Value THEN
  524.                 Root := Root.Left; Search(Root,Target);
  525.             ELSE
  526.                 Root := Root.Right;
  527.                 Search(Root,Target);
  528.             END IF;
  529.         END IF;
  530.     END IF;
  531. END Search;
  532.  
  533. BEGIN -- MAIN
  534.     Create;
  535.     PUT_LINE("Created array");
  536.     -- Building the binary tree
  537.     PUT("Press <CR> to time tree creation ");
  538.     GET(dummy); NEW_LINE;
  539.     TreeRoot := null;
  540.     FOR I IN 1..SIZE LOOP
  541.        Insert(TreeRoot,Numbers(I));
  542.     END LOOP;
  543.     NEW_LINE;
  544.     PUT_LINE("Created Tree");
  545.     PUT("Press <CR> to time tree search ");
  546.     GET(dummy); NEW_LINE;
  547.     FOR Iter IN 1..MainLoopCount LOOP
  548.         FOR I IN reverse 1..SIZE LOOP
  549.             Search(TreeRoot,Numbers(I));
  550.         END LOOP;
  551.     END LOOP;
  552.     NEW_LINE;
  553.     PUT_LINE("DONE");
  554. END MTPtr;
  555.  
  556. Listing 8.  Source code for Ada disk-write benchmark program.
  557.  
  558. with TEXT_IO;
  559. use TEXT_IO;
  560.  
  561. Procedure MTWRITE is
  562.  
  563. Num_Rec : constant := 512;
  564.  
  565. Small : STRING(1..30);
  566. Big : STRING(1..120);
  567. F : FILE_TYPE;
  568.  
  569. BEGIN
  570.    Small(1..30) := "123456781234567812345678123456";
  571.    Big := Small & Small & Small & Small;
  572.  
  573.    CREATE(F, OUT_FILE, "A:TEMPO.DAT");
  574.  
  575.    FOR I in 1..Num_Rec LOOP
  576.        PUT_LINE(F, Big);
  577.    END LOOP;
  578.  
  579.    CLOSE(F);
  580.    PUT_LINE("DONE");
  581.  
  582. END MTWRITE;
  583.  
  584. Listing 9.  Source code for Ada disk-read benchmark program.
  585.  
  586. with TEXT_IO;
  587. use TEXT_IO;
  588.  
  589. Procedure MTREAD is
  590.  
  591. Num_Rec : constant := 512;
  592.  
  593. Big : STRING(1..120);
  594. Last : NATURAL;
  595. F : FILE_TYPE;
  596.  
  597. BEGIN
  598.  
  599.    OPEN(F, IN_FILE, "A:TEMPO.DAT");
  600.  
  601.    FOR I in 1..Num_Rec LOOP
  602.       GET_LINE(F, Big, Last);
  603.    END LOOP;
  604.    CLOSE(F);
  605.    PUT_LINE("DONE");
  606. END MTREAD;
  607.  
  608.